package com.jt.blog.controller;

import com.jt.blog.domain.Tag;
import com.jt.blog.service.TagService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.CopyOnWriteArrayList;

@RestController
@RequestMapping("/tag")
public class TagController {
    @Autowired
    private TagService tagService;

    //private List<Tag> tags=new ArrayList<>();
    private List<Tag> tags=new CopyOnWriteArrayList<>();//本地 cache

    //null
    @GetMapping("/{id}")
    public Tag doSelectById(@PathVariable("id") Long id){

        //查询本地缓存
        for (Tag t :tags){

            if (t.getId().equals(id))

                return t;

        }

        //查询redis，mysql
        return tagService.selectById(id);

    }


    @PostMapping
    public String daInsertTag(Tag tag){

        //向数据库写入数据
        tagService.insertTag(tag);

        //更新本地缓存
        tags.add(tag);

        return "insert ok";

    }

    @PutMapping
        public String daUpdateTag(Tag tag){

        //向数据库写入数据
        tagService.updateTag(tag);

        //更新本地缓存
        if (tags.contains(tag)){//id =1 name=mysql;id=1 name=mysql8.9

            int index = tags.indexOf(tag);
            Tag removeTag = tags.remove(index);
            tags.add(index,tag);

        }

        for (Tag t : tags){//Long 1 == 1 1000 == 1000

            if (t.getId().equals(tag.getId())){

                t.setName(tag.getName());

            }

        }

        return "update ok";

    }

    @GetMapping
    public  List<Tag> doSelectTags(){

        if(tags.isEmpty()) {

            synchronized (tags) {

                if(tags.isEmpty()) {

                    tags.addAll(tagService.selectTags());//1.redis,2.mysql

                    //doTimerRefreshTask();

                }

            }

        }

        return tags;

    }

    /**Spring中Bean对象的生命周期方法，对象初始化时执行测方法*/
    @PostConstruct
    public void doInit(){

        doTimerRefreshTask();

    }

//    public TagController(){
//
//        doTimerRefreshTask();
//
//    }
    @PreDestroy
    public void doDestory(){

        timer.cancel();

    }

    private Timer timer;

    //定义刷新任务
    private void doTimerRefreshTask(){

        //构建一个定时认为调度对象
        timer = new Timer();

        //构建一个任务对象
        TimerTask Task = new TimerTask(){

            @Override
            public void run(){

                System.out.println("refresh cache");

                tags.clear();

            }

        };

        //执行任务对象（每隔5秒执行一次）
        timer.schedule(Task,5000,60000);

    }

}
//redis  分布式缓存
//Tomcat 本地缓存(JVM内部提供)
//Browser(查询)-->Nginx-->Gateway,Gateway,..-->(Tomcat,Tomcat,Tomcat)
//查询-->本地cache-->分布式cache-->mysql
